package com.ainge.easystudy.designpattern.proxy;

/**
 * CGLib 和 JDK 动态代理对比
 * 1. JDK 动态代理实现了被代理对象的接口,CGLib代理继承了被代理对象。
 * 2. JDK 动态代理和CGLib代理都在运行期生成字节码，而JDK动态代理直接写Class字节码，
 * CGLib代理使用ASM框架写Class字节码 ，CGlib代理实现更复杂,生成代理类比JDK动态代理效率低。
 * 3. JDK 动态代理调用代理方法是通过反射机制调用的，CGLib代理是通过FastClass机制直接调用方法的,CGLib代理的执行效率更高。
 *
 * Spring 中的代理选择原则
 * (1 ）当 Bean 有实现接口时， Spring 就会用 JDK 动态代理 。
 * (2 ）当 Bean 没有实现接口时， Spring 会选择 CGLib 代 理。
 * (3) Spring 可以通过配置强制使用 CGLib 代理，只需在Spring的配置文件中加入如下代码 ：
 * <aop:aspectj -autoproxy Proxy-target-class ＝”true"/>
 * <p>
 * <p>
 * 代理模式具有以下优点：
 * (1）代理模式能将代理对象与 真实被调用目 标对 象分离。
 * (2）在 一定程度 上降低了系统的精合性，扩展性好 。
 * (3）可以起到保护目标对象的作用。
 * (4）可以增强目标对象的功能 。
 * 当然，代理模式也有缺点 ：
 * (1）代理模式会造成系统设计中类的数量 增加。
 * (2）在 客户端和目标对象中增加一个代理对象，会导致请求处理速度变慢。
 * (3）增加了系统的复杂度。
 */